﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;
using System.Windows.Forms;
using System.Threading;
using DTO;

namespace DAO
{
    public class PhieuDatComDAO
    {
        public int LayKhoiLuongTonMonAn(int mamonan)
        {
            int khoiluongton = 0;
            SqlConnection conn = null;
            SqlDataReader reader = null;
            try
            {
                string sql = "Select sum(KhoiLuongTon) from KhoThucPham ktp,CongThuc ct where ktp.ID_ThucPham = ct.ID_ThucPham and ct.ID_MonAn = " + mamonan + "";
                conn = DataProvider2.ConnectDB();
                SqlCommand cm = new SqlCommand(sql, conn);
                reader = cm.ExecuteReader();
                while (reader.Read())
                {
                    khoiluongton = reader.GetInt32(0);
                }
            }
            catch (SqlException)
            { }
            finally
            {
                conn.Close();
            }
            return khoiluongton;
        }

        public DateTime LayNgayBatDauKhuyenMai(int idkhuyenmai)
        {
            DateTime ngaybatdau;
            SqlConnection conn = null;
            string sql = "SELECT NgayBatDau FROM KhuyenMai WHERE ID_KhuyenMai = " + idkhuyenmai + "";
            conn = DataProvider2.ConnectDB();
            SqlCommand cmd = new SqlCommand(sql, conn);
            ngaybatdau = (DateTime)cmd.ExecuteScalar();
            conn.Close();
            return ngaybatdau;
        }

        public DateTime LayNgayKetThucKhuyenMai(int idkhuyenmai)
        {
            DateTime ngayketthuc;
            SqlConnection conn = null;
            string sql = "SELECT NgayKetThuc FROM KhuyenMai WHERE ID_KhuyenMai =" + idkhuyenmai + "";
            conn = DataProvider2.ConnectDB();
            SqlCommand cmd = new SqlCommand(sql, conn);
            ngayketthuc = (DateTime)cmd.ExecuteScalar();
            conn.Close();
            return ngayketthuc;
        }

        public int LayKhoiLuongMonAn(int mamonan)
        {
            int khoiluong = 0;
            SqlConnection conn = null;
            SqlDataReader reader = null;
            try
            {
                string sql = "Select sum(KhoiLuong) From CongThuc where ID_MonAn=" + mamonan + "";
                conn = DataProvider2.ConnectDB();
                SqlCommand cm = new SqlCommand(sql, conn);
                reader = cm.ExecuteReader();
                while (reader.Read())
                {
                    khoiluong = reader.GetInt32(0);
                }
            }
            catch (SqlException)
            { }
            finally
            {
                conn.Close();
            }

            return khoiluong;
        }

        public int TinhSoLuongTon(int mamonan)
        {
            int soluongton = 0;
            int khoiluongton = LayKhoiLuongTonMonAn(mamonan);
            int khoiluongmon = LayKhoiLuongMonAn(mamonan);
            soluongton = khoiluongton / khoiluongmon;
            return soluongton;
        }

        public DataSet XemDanhSachPhieuDatComDAO()
        {

            DataSet dtset = new DataSet();
            DataProvider con = new DataProvider(0);
            try
            {
                dtset = con.ExecuteDataTable("sp_XemDanhSachPhieuDatCom", CommandType.StoredProcedure);

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            return dtset;
        }
        public int LayMaPhieuDatComMax()
        {
            int mapdc = 0;
            SqlConnection conn = null;
            SqlDataReader reader = null;
            try
            {
                string sql = "Select Max(ID_PhieuDatCom) From PhieuDatCom";
                conn = DataProvider2.ConnectDB();
                SqlCommand cm = new SqlCommand(sql, conn);
                reader = cm.ExecuteReader();
                while (reader.Read())
                {
                    mapdc = reader.GetInt32(0);
                }
            }
            catch (SqlException)
            { }
            finally
            {
                conn.Close();
            }

            return mapdc;
        }
        /// <summary>
        /// tranh chấp đồng thời dirty read
        /// </summary>
        /// <param name="flag"></param>
        /// <returns></returns>
        public List<PhieuDatComDTO> XemDanhSacPhieuDatCom_DirtyRead(int flag)
        {
            List<PhieuDatComDTO> list = new List<PhieuDatComDTO>();
            SqlConnection conn = null;
            SqlDataReader reader = null;
            SqlTransaction _tran = null;
            
            try
            {
                conn = DataProvider2.ConnectDB();
                if (flag == 0) // Chế độ lỗi
                {
                    _tran = conn.BeginTransaction(IsolationLevel.ReadUncommitted); //Xảy ra tranh chấp 
                }
                else if (flag == 1) //chế độ fix lỗi
                {
                    _tran = conn.BeginTransaction(IsolationLevel.ReadCommitted); //Fix lỗi
                }
                String sql = "SELECT * FROM PhieuDatCom";
                SqlCommand cmd = conn.CreateCommand();
                cmd.Transaction = _tran;
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = sql;
                reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    PhieuDatComDTO pdcDTO = new PhieuDatComDTO();

                    pdcDTO.ID_PhieuDatCom = reader.GetInt32(0);
                    pdcDTO.NgayDat = reader.GetDateTime(1);
                    pdcDTO.NgayGiao = reader.GetDateTime(2);
                    pdcDTO.GioDat = reader.GetTimeSpan(3);
                    pdcDTO.GioGiao = reader.GetTimeSpan(4);
                    pdcDTO.ID_NhanVienDat = reader.GetInt32(5);
                    pdcDTO.ID_NhanVienGiao = reader.GetInt32(6);
                    pdcDTO.ID_KhachHang = reader.GetInt32(7);
                    pdcDTO.ID_KhuyenMai = reader.GetInt32(8);
                    pdcDTO.GhiChu = reader.GetString(9);
                    pdcDTO.TongTien = reader.GetInt32(10);
                    pdcDTO.TrangThai = reader.GetInt32(11);

                    list.Add(pdcDTO);
                }
                reader.Close();
                _tran.Commit(); //
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi : " + ex.Message);
                _tran.Rollback();
                
            }
            finally
            {
                if (conn.State == ConnectionState.Open)
                    conn.Close();
            }
            return list;
        }
        //Tran-them
        public String ThemPhieuDatCom_DirtyRead(PhieuDatComDTO pdcDTO, int flag, int idkhuyenmai)
        {
            String mess = "";
            SqlConnection conn = null;
            SqlTransaction _tran = null;
            //PhieuDatComDTO pdcDTO = new PhieuDatComDTO();
            try
            {
                conn = DataProvider2.ConnectDB();
                _tran = conn.BeginTransaction();
                String sql = "INSERT INTO PhieuDatCom(ID_PhieuDatCom,NgayDat,NgayGiao,GioDat,GioGiao,ID_NhanVienDat,ID_NhanVienGiao,ID_KhachHang,ID_KhuyenMai,GhiChu,TongTien,TrangThai)";
                sql += "VALUES(@ID_PhieuDatCom,@NgayDat,@NgayGiao,@GioDat,@GioGiao,@ID_NhanVienDat,@ID_NhanVienGiao,@ID_KhachHang,@ID_KhuyenMai,@GhiChu,@TongTien,@TrangThai)";
                SqlCommand cmd = conn.CreateCommand();
                cmd.Transaction = _tran;
                cmd.CommandType = CommandType.Text;

                if (flag == 0) //CHẾ ĐỘ = 0 / LỖI
                {
                    //cmd.CommandTimeout = 10;
                   sql += " waitfor delay '0:0:10'";
                }

                //if (flag == 0)
                //    _tran = conn.BeginTransaction(IsolationLevel.ReadCommitted);
                //else if (flag == 1)
                //    _tran = conn.BeginTransaction(IsolationLevel.ReadCommitted);
                cmd.CommandText = sql;
                SqlParameter para;
                para = cmd.Parameters.Add("@ID_PhieuDatCom", SqlDbType.Int);
                para.Value = pdcDTO.ID_PhieuDatCom;
                para = cmd.Parameters.Add("@NgayDat", SqlDbType.Date);
                para.Value = pdcDTO.NgayDat;
                para = cmd.Parameters.Add("@NgayGiao", SqlDbType.Date);
                para.Value = pdcDTO.NgayGiao;
                para = cmd.Parameters.Add("@GioDat", SqlDbType.Time);
                para.Value = pdcDTO.GioDat;
                para = cmd.Parameters.Add("@GioGiao", SqlDbType.Time);
                para.Value = pdcDTO.GioGiao;
                para = cmd.Parameters.Add("@ID_NhanVienDat", SqlDbType.Int);
                para.Value = pdcDTO.ID_NhanVienDat;
                para = cmd.Parameters.Add("@ID_NhanVienGiao", SqlDbType.Int);
                para.Value = pdcDTO.ID_NhanVienGiao;
                para = cmd.Parameters.Add("@ID_KhachHang", SqlDbType.Int);
                para.Value = pdcDTO.ID_KhachHang;
                para = cmd.Parameters.Add("@ID_KhuyenMai", SqlDbType.Int);
                para.Value = pdcDTO.ID_KhuyenMai;
                para = cmd.Parameters.Add("@GhiChu", SqlDbType.NVarChar);
                para.Value = pdcDTO.GhiChu;
                para = cmd.Parameters.Add("@TongTien", SqlDbType.Int);
                para.Value = pdcDTO.TongTien;
                para = cmd.Parameters.Add("@TrangThai", SqlDbType.Int);
                para.Value = pdcDTO.TrangThai;

                cmd.ExecuteNonQuery();
                //Kiểm tra SỐ_LƯỢNG_NHẬP vào Và SỐ_LƯỢNG_TỒN trong kho
                //Nếu SỐ_LƯỢNG_NHẬP<SỐ_LƯỢNG_TỒN thì Rollback
                //int so_luong_nhap = 0;
                //int so_luong_ton = 0;
                //if(so_luong_nhap<so_luong_ton)
                //{
                //    _tran.Rollback();
                //    MessageBox.Show("Lỗi: Số lượng món ăn còn không đủ");
                //}
                //Ngược lại thì Commit
                //else

                Thread.Sleep(5000);

                DateTime ngaybatdau = LayNgayBatDauKhuyenMai(idkhuyenmai);
                DateTime ngayketthuc = LayNgayKetThucKhuyenMai(idkhuyenmai);
                DateTime ngayhientai = DateTime.Today;
                if (ngayhientai < ngaybatdau || ngayhientai > ngayketthuc)
                {
                    _tran.Rollback();
                    return mess = "Lỗi: Khuyến mãi đã hết hạn! Mời nhân viên chọn lại khuyến mãi";                    
                }
                else
                {
                    _tran.Commit();
                }
                //int tt = pdcDTO.TrangThai;
                //if (tt != 1)
                //{
                    
                    //MessageBox.Show("Lỗi: Số lượng món ăn còn không đủ");
                    
                //}
                //else
                    
            }
            catch (Exception ex)
            {
                mess = "Lỗi thêm phiếu đặt cơm rollback transaction";
                MessageBox.Show("Lỗi : " + ex.Message);
                _tran.Rollback();
            }
            finally
            {
                if (conn.State == ConnectionState.Open)
                    conn.Close(); 
            }
            return mess;
        }

        public String ThemPhieuDatCom_LostUpdate(PhieuDatComDTO pdcDTO, int flag)
        {
            String mess = "";
            SqlConnection conn = null;
            //SqlTransaction _tran = null;
            try
            {
                conn = DataProvider2.ConnectDB(flag);
                //_tran = conn.BeginTransaction();
                String sql = "INSERT INTO PhieuDatCom(ID_PhieuDatCom,NgayDat,NgayGiao,GioDat,GioGiao,ID_NhanVienDat,ID_NhanVienGiao,ID_KhachHang,ID_KhuyenMai,GhiChu,TongTien,TrangThai)";
                sql += "VALUES(@ID_PhieuDatCom,@NgayDat,@NgayGiao,@GioDat,@GioGiao,@ID_NhanVienDat,@ID_NhanVienGiao,@ID_KhachHang,@ID_KhuyenMai,@GhiChu,@TongTien,@TrangThai)";
                SqlCommand cmd = conn.CreateCommand();
                //cmd.Transaction = _tran;
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = sql;
                SqlParameter para;
                para = cmd.Parameters.Add("@ID_PhieuDatCom", SqlDbType.Int);
                para.Value = pdcDTO.ID_PhieuDatCom;
                para = cmd.Parameters.Add("@NgayDat", SqlDbType.Date);
                para.Value = pdcDTO.NgayDat;
                para = cmd.Parameters.Add("@NgayGiao", SqlDbType.Date);
                para.Value = pdcDTO.NgayGiao;
                para = cmd.Parameters.Add("@GioDat", SqlDbType.Time);
                para.Value = pdcDTO.GioDat;
                para = cmd.Parameters.Add("@GioGiao", SqlDbType.Time);
                para.Value = pdcDTO.GioGiao;
                para = cmd.Parameters.Add("@ID_NhanVienDat", SqlDbType.Int);
                para.Value = pdcDTO.ID_NhanVienDat;
                para = cmd.Parameters.Add("@ID_NhanVienGiao", SqlDbType.Int);
                para.Value = pdcDTO.ID_NhanVienGiao;
                para = cmd.Parameters.Add("@ID_KhachHang", SqlDbType.Int);
                para.Value = pdcDTO.ID_KhachHang;
                para = cmd.Parameters.Add("@ID_KhuyenMai", SqlDbType.Int);
                para.Value = pdcDTO.ID_KhuyenMai;
                para = cmd.Parameters.Add("@GhiChu", SqlDbType.NVarChar);
                para.Value = pdcDTO.GhiChu;
                para = cmd.Parameters.Add("@TongTien", SqlDbType.Int);
                para.Value = pdcDTO.TongTien;
                para = cmd.Parameters.Add("@TrangThai", SqlDbType.Int);
                para.Value = pdcDTO.TrangThai;

                cmd.ExecuteNonQuery();

            }
            catch (Exception ex)
            {
                mess = "Lỗi thêm phiếu đặt cơm rollback transaction";
                MessageBox.Show("Lỗi : " + ex.Message);
                //_tran.Rollback();
            }
            finally
            {
                if (conn.State == ConnectionState.Open)
                    conn.Close();
            }
            return mess;
        }
    }
}
